/*
 *
重载运算符[],设计一个可以自动检查数组是否越界的类（一旦越界，提示错误信息）
访问第5个元素： 9
访问第6个元素： 错误： out of Range...
const 访问第5个元素： 5
访问第6个元素： 错误： const out of Range...

*/

#include<iostream>
using namespace std;

class Array{
	private:
		int* m_array;
		int m_size;
	public:
		Array(const int* tmp, int size) : m_size(size){
			m_array = new int[m_size];
			for(int i = 0; i < m_size; i++){
				m_array[i] = tmp[i];
			}
		}
		~Array(){
			delete[] m_array;
		}
		//禁用拷贝构造函数和拷贝赋值函数
		Array(const Array&) = delete;
		Array& operator=(const Array&) = delete;
		//非const版本
		int& operator[](int index){
			if(index >= m_size || index < 0){
				throw out_of_range("out of Range...");
			}
			return m_array[index];
		}
		//const版本
		const int& operator[](int index) const{
			if(index >= m_size || index < 0){
				throw out_of_range("const out of Range...");
			}
			return m_array[index];
		}

};

int main(){	
	int arr1[5] = {1, 2, 3, 4, 5};

	//非const
	//初始化得到自定义数组类
	Array array(arr1, sizeof(arr1) / sizeof(arr1[0]));
	//正常访问
	array[4] = 9;
	cout << "访问第5个元素： " << array[4] << endl;
	//异常访问
	try{
		cout << "访问第6个元素： " << array[5] << endl;
	}catch (out_of_range& e){
		cerr << "错误： " << e.what() << endl;
	}

	const Array consArry(arr1, sizeof(arr1) / sizeof(arr1[0]));
	//正常访问
	cout << "const 访问第5个元素： " << consArry[4] << endl;
	//异常访问
	try{
		cout << "访问第6个元素： " << consArry[5] << endl;
	}catch (out_of_range& e){
		cerr << "错误： " << e.what() << endl;
	}

	return 0;
}
